import java.util.*;

public class demo1 {
  static   int m;
   static int n;
    public static int cutOffTree(List<List<Integer>> forest) {
        List<int[]>list=new ArrayList<>();
         m=forest.size();
         n=forest.get(0).size();
        for (int i = 0; i <m ; i++) {
            for (int j = 0; j <n ; j++) {
                if(forest.get(i).get(j)>1){
                    list.add(new int[]{i,j});
                }
            }
        }
        Collections.sort(list,(l1,l2)->{
            return forest.get(l1[0]).get(l1[1])-forest.get(l2[0]).get(l2[1]);
        });
        int ex=0;
        int ey=0;
        int sum=0;
        for(int []arr:list){
            boolean[][]dp=new boolean[m][n];
            int temp=BFS(forest,ex,ey,arr[0],arr[1],dp);
            if(temp==-1)return -1;
            sum+=temp;
            ex=arr[0];
            ey=arr[1];
        }
        return sum;
    }
   static int[]dx={0,0,1,-1};
   static  int[]dy={1,-1,0,0};
    public static int BFS(List<List<Integer>> forest,int ex,int ey,int i,int j,boolean[][]dp){
        if(ex==i&&ey==j)return 0;
        Queue<int[]>queue=new LinkedList<>();
        int sum=0;
        queue.add(new int[]{ex,ey});
        while (!queue.isEmpty()){
            int size=queue.size();
            sum++;
            for(int a=0;a<size;a++){
                int[] poll = queue.poll();
                dp[poll[0]][poll[1]]=true;
                for(int b=0;b<4;b++){
                    int x=poll[0]+dx[b];
                    int y=poll[1]+dy[b];
                    if(x>=0&&x<m&&y>=0&&y<n&&forest.get(x).get(y)!=0&& !dp[x][y]){
                        if(x==i&&y==j)return sum;
                        dp[x][y]=true;
                        queue.add(new int[]{x,y});
                    }
                }
            }
        }
        return -1;
    }

    public static void main(String[] args) {
        List<List<Integer>> forest = new ArrayList<>();
        List<Integer> list = new ArrayList<>();
        list.add(2);
        list.add(3);
        list.add(4);
        forest.add(list);
        List<Integer> list1 = new ArrayList<>();
        list1.add(0);
        list1.add(0);
        list1.add(4);
        forest.add(list1);
        List<Integer> list2 = new ArrayList<>();
        list2.add(7);
        list2.add(6);
        list2.add(5);
        forest.add(list2);
        System.out.println(cutOffTree(forest));
    }
}
